//package com.kun.companion.core.queue;
//
//import java.util.concurrent.TimeUnit;
//
///**
// * 队列线程池配置类
// * <p>
// * 用于定义消息队列处理相关的线程池参数及幂等性配置，包含以下核心配置项：
// * 1. 线程池基础参数（核心线程数/最大线程数/队列容量）
// * 2. 幂等性校验有效期
// * 3. 最大重试次数
// * </p>
// *
// * @author gzc
// * @since 2025/2/3
// **/
//public class QueueConfig {
//    /**
//     * 核心线程数（默认值：CPU核心数）
//     * <p>保持常驻的线程数量，建议根据CPU密集型/IO密集型任务调整</p>
//     */
//    private int corePoolSize;
//
//    /**
//     * 最大线程数（默认值：核心线程数*2）
//     * <p>线程池允许创建的最大线程数，当队列满时创建新线程</p>
//     */
//    private int maxPoolSize;
//
//    /**
//     * 队列容量（默认值：2000）
//     * <p>任务队列的存储容量，超出后将触发最大线程数创建策略</p>
//     */
//    private int queueCapacity;
//
//    /**
//     * 幂等性校验有效期（单位：分钟，默认值：10）
//     * <p>消息去重的时间窗口，防止重复消费</p>
//     */
//    private long idempotencyExpireMinutes;
//
//    /**
//     * 最大重试次数（默认值：3）
//     * <p>消息处理失败时的最大重试次数，超过后进入死信队列</p>
//     */
//    private int maxRetryAttempts;
//    /**
//     * 空闲线程存活时间（默认值：3）
//     * <p>当线程数超过核心线程数时，多余的空闲线程在终止前等待新任务的最长时间</p>
//     */
//    private long keepAliveTime;
//
//    /**
//     * 时间单位（默认值：分钟）
//     * <p>keepAliveTime的时间单位，推荐使用秒级精度</p>
//     */
//    private TimeUnit timeUnit;
//
//    /**
//     * 创建默认配置实例
//     * <p>推荐配置策略：</p>
//     * <ul>
//     *   <li>核心线程数 = CPU核心数（充分利用多核）</li>
//     *   <li>最大线程数 = 核心数*2（应对突发流量）</li>
//     *   <li>队列容量 = 2000（平衡内存与吞吐量）</li>
//     *   <li>幂等性有效期 = 10分钟（典型业务场景）</li>
//     *   <li>最大重试次数 = 3（兼顾可靠性与资源消耗）</li>
//     *   <li>空闲线程存活时间 = 3分钟（平衡资源释放与线程创建开销）</li>
//     *   <li>时间单位 = 分钟（适合大多数业务场景）</li>
//     * </ul>
//     */
//    public static QueueConfig defaultConfig() {
//        QueueConfig config = new QueueConfig();
//        config.corePoolSize = Runtime.getRuntime().availableProcessors();
//        config.maxPoolSize = config.corePoolSize * 2;
//        config.queueCapacity = 2000;
//        config.idempotencyExpireMinutes = 10L;
//        config.maxRetryAttempts = 3;
//        config.keepAliveTime = 3;
//        config.timeUnit = TimeUnit.MINUTES;
//        return config;
//    }
//
//    public int getCorePoolSize() {
//        return corePoolSize;
//    }
//
//    public void setCorePoolSize(int corePoolSize) {
//        this.corePoolSize = corePoolSize;
//    }
//
//    public int getMaxPoolSize() {
//        return maxPoolSize;
//    }
//
//    public void setMaxPoolSize(int maxPoolSize) {
//        this.maxPoolSize = maxPoolSize;
//    }
//
//    public int getQueueCapacity() {
//        return queueCapacity;
//    }
//
//    public void setQueueCapacity(int queueCapacity) {
//        this.queueCapacity = queueCapacity;
//    }
//
//    public long getIdempotencyExpireMinutes() {
//        return idempotencyExpireMinutes;
//    }
//
//    public void setIdempotencyExpireMinutes(long idempotencyExpireMinutes) {
//        this.idempotencyExpireMinutes = idempotencyExpireMinutes;
//    }
//
//    public int getMaxRetryAttempts() {
//        return maxRetryAttempts;
//    }
//
//    public void setMaxRetryAttempts(int maxRetryAttempts) {
//        this.maxRetryAttempts = maxRetryAttempts;
//    }
//
//    public long getKeepAliveTime() {
//        return keepAliveTime;
//    }
//
//    public TimeUnit getTimeUnit() {
//        return timeUnit;
//    }
//
//    /**
//     * 设置空闲线程存活时间
//     *
//     * @param keepAliveTime 必须大于等于0
//     */
//    public void setKeepAliveTime(long keepAliveTime) {
//        if (keepAliveTime < 0) {
//            throw new IllegalArgumentException("空闲线程存活时间不能为负数");
//        }
//        this.keepAliveTime = keepAliveTime;
//    }
//
//    /**
//     * 设置时间单位
//     *
//     * @param timeUnit 不可为null
//     */
//    public void setTimeUnit(TimeUnit timeUnit) {
//        if (timeUnit == null) {
//            throw new IllegalArgumentException("时间单位不能为null");
//        }
//        this.timeUnit = timeUnit;
//    }
//}